package com.demo.bridge08;

/**
 * Abstraction 抽象类：
 *
 * 1、桥接模式将系统的抽象部分与实现部分分离解耦，使他们可以独立的变化。
 * 2、为了达到让抽象部分和实现部分独立变化的目的，桥接模式使用组合关系来代替继承关系，抽象部分拥有实现部分的接口对象，
 * 从而能够通过这个接口对象来调用具体实现部分的功能。
 * 3、也就是说，桥接模式中的桥接是一个单方向的关系，只能够抽象部分去使用实现部分的对象，而不能反过来。
 *
 * 桥接模式符合“开闭原则”，提高了系统的可拓展性，在两个变化维度中任意扩展一个维度，都不需要修改原来的系统；
 * 并且实现细节对客户不透明，可以隐藏实现细节。但是由于聚合关系建立在抽象层，要求开发者针对抽象进行编程，
 * 这增加系统的理解和设计难度。
 *
 * （1）系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性，避免在两个层次之间建立静态的继承联系，
 *      则可以通过桥接模式使他们在抽象层建立一个关联关系；
 * （2）系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时
 * （3）一个类存在两个独立变化的维度，而这两个维度都需要进行扩展。
 */
public abstract class Abstraction {
    private final Implementor implementor;
 
    public Abstraction(Implementor implementor) {
        this.implementor = implementor;
    }
 
    public void operation() {
        implementor.operationImpl();
    }
}